﻿// -----------------------------------------------------------------------
// <copyright file="GeneradorDeSelect.cs" company="Hexacta S.A.">
// TODO: Update copyright text.
// </copyright>
// -----------------------------------------------------------------------

namespace generador
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using gudusoft.gsqlparser;
    using System.Collections;

    /// <summary>
    /// TODO: 
    /// </summary>
    public static class GeneradorDeDelete
    {
        //limitaciones hasta el momento: join 1 tabla, no uso funciones como SELECT sum(field1) FROM, 
        //ORDER By no tiene, las expresiones solo con AND y no chequeo tipos de las columnas solo aplico valores enteros.., Ademas es limitada la cantidad
        public static InfoDeLaQuery GenerarDelete(DataSet ds, Dictionary<string, int> diccionario_Tabla_Cantidad_de_Registros)
        {
            TDeleteSqlStatement statement = new TDeleteSqlStatement(TDbVendor.DbVMssql);
            statement.IsParsed = true;

            InfoDeLaQuery info = new InfoDeLaQuery();
            info.Query = statement;

            TLzField column = null;

            DataTable tabla_elegida = Utiles.ElegirTablaAlAzar(ds);
            IList<DataColumn> columnas_posibles;

            columnas_posibles = Utiles.ConvertirAIListFromDataColumnCollection(tabla_elegida.Columns);

            statement.Table = new TLzTable(statement);
            statement.Table.TableName = tabla_elegida.TableName;

            info.RowsExamined = diccionario_Tabla_Cantidad_de_Registros[tabla_elegida.TableName];

            if (Utiles.RandomEntreTrueYFalse())
            { 
                AgregarWhere(statement, columnas_posibles);
                //SI TIENE WHERE NO SE BIEN CUANTOS REGISTRO RETORNARA, ENTONCES RANDOM DE LOS QUE EXAMINA
                info.RowsSent = Utiles.random.Next(info.RowsExamined);
            }
            else
            {
                info.RowsSent = info.RowsExamined;
            }

            info.LockTime = Utiles.random.Next(0, Constantes.TiempoMaximoLockeoDeTabla);

            return info;
        }


        private static void AgregarWhere(TDeleteSqlStatement statement, IList<DataColumn> columnas_posibles)
        {
            TLzCustomExpression where = new TLzCustomExpression(statement);

            int cantidad_binarias = DameAlAzarCantidadExpresionesBinarias();
            where = Utiles.GenerarExpresionWhereRecursivamente(columnas_posibles, where, cantidad_binarias);

            statement.WhereClauseText = where.AsText;
        }

        private static int DameAlAzarCantidadExpresionesBinarias()
        {
            return Utiles.random.Next(4);
        }
        
    }
}


 ;